home *** CD-ROM | disk | FTP | other *** search
/ Programming Windows (5th Edition) / Programming Windows, 5th ed. - Companion CD (097-0002183)(1999).iso / Chap16 / ShowDib3 / ShowDib3.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-10-09  |  6.7 KB  |  214 lines

  1. /*------------------------------------------------
  2.    SHOWDIB3.C -- Displays DIB with native palette
  3.                  (c) Charles Petzold, 1998
  4.   ------------------------------------------------*/
  5.  
  6. #include <windows.h>
  7. #include "PackeDib.h"
  8. #include "resource.h"
  9.  
  10. LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
  11.  
  12. TCHAR szAppName[] = TEXT ("ShowDib3") ;
  13.  
  14. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
  15.                     PSTR szCmdLine, int iCmdShow)
  16. {
  17.      HWND     hwnd ;
  18.      MSG      msg ;
  19.      WNDCLASS wndclass ;
  20.  
  21.      wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
  22.      wndclass.lpfnWndProc   = WndProc ;
  23.      wndclass.cbClsExtra    = 0 ;
  24.      wndclass.cbWndExtra    = 0 ;
  25.      wndclass.hInstance     = hInstance ;
  26.      wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
  27.      wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
  28.      wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
  29.      wndclass.lpszMenuName  = szAppName ;
  30.      wndclass.lpszClassName = szAppName ;
  31.  
  32.      if (!RegisterClass (&wndclass))
  33.      {
  34.           MessageBox (NULL, TEXT ("This program requires Windows NT!"), 
  35.                       szAppName, MB_ICONERROR) ;
  36.           return 0 ;
  37.      }
  38.  
  39.      hwnd = CreateWindow (szAppName, TEXT ("Show DIB #3: Native Palette"),
  40.                           WS_OVERLAPPEDWINDOW,
  41.                           CW_USEDEFAULT, CW_USEDEFAULT,
  42.                           CW_USEDEFAULT, CW_USEDEFAULT, 
  43.                           NULL, NULL, hInstance, NULL) ;
  44.  
  45.      ShowWindow (hwnd, iCmdShow) ;
  46.      UpdateWindow (hwnd) ;
  47.  
  48.      while (GetMessage (&msg, NULL, 0, 0))
  49.      {
  50.           TranslateMessage (&msg) ;
  51.           DispatchMessage (&msg) ;
  52.      }
  53.      return msg.wParam ;
  54. }
  55.  
  56. LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  57. {
  58.      static BITMAPINFO * pPackedDib ;
  59.      static HPALETTE     hPalette ;
  60.      static int          cxClient, cyClient ;
  61.      static OPENFILENAME ofn ;
  62.      static TCHAR        szFileName [MAX_PATH], szTitleName [MAX_PATH] ;
  63.      static TCHAR        szFilter[] = TEXT ("Bitmap Files (*.BMP)\0*.bmp\0")
  64.                                       TEXT ("All Files (*.*)\0*.*\0\0") ;
  65.      HDC                 hdc ;
  66.      PAINTSTRUCT         ps ;
  67.  
  68.      switch (message)
  69.      {
  70.      case WM_CREATE:
  71.           ofn.lStructSize       = sizeof (OPENFILENAME) ;
  72.           ofn.hwndOwner         = hwnd ;
  73.           ofn.hInstance         = NULL ;
  74.           ofn.lpstrFilter       = szFilter ;
  75.           ofn.lpstrCustomFilter = NULL ;
  76.           ofn.nMaxCustFilter    = 0 ;
  77.           ofn.nFilterIndex      = 0 ;
  78.           ofn.lpstrFile         = szFileName ;
  79.           ofn.nMaxFile          = MAX_PATH ;
  80.           ofn.lpstrFileTitle    = szTitleName ;
  81.           ofn.nMaxFileTitle     = MAX_PATH ;
  82.           ofn.lpstrInitialDir   = NULL ;
  83.           ofn.lpstrTitle        = NULL ;
  84.           ofn.Flags             = 0 ;
  85.           ofn.nFileOffset       = 0 ;
  86.           ofn.nFileExtension    = 0 ;
  87.           ofn.lpstrDefExt       = TEXT ("bmp") ;
  88.           ofn.lCustData         = 0 ;
  89.           ofn.lpfnHook          = NULL ;
  90.           ofn.lpTemplateName    = NULL ;
  91.  
  92.           return 0 ;
  93.  
  94.      case WM_SIZE:
  95.           cxClient = LOWORD (lParam) ;
  96.           cyClient = HIWORD (lParam) ;
  97.           return 0 ;
  98.  
  99.      case WM_COMMAND:
  100.           switch (LOWORD (wParam))
  101.           {
  102.           case IDM_FILE_OPEN:
  103.  
  104.                     // Show the File Open dialog box
  105.  
  106.                if (!GetOpenFileName (&ofn))
  107.                     return 0 ;
  108.                
  109.                     // If there's an existing packed DIB, free the memory
  110.  
  111.                if (pPackedDib)
  112.                {
  113.                     free (pPackedDib) ;
  114.                     pPackedDib = NULL ;
  115.                }
  116.                
  117.                     // If there's an existing logical palette, delete it
  118.  
  119.                if (hPalette)
  120.                {
  121.                     DeleteObject (hPalette) ;
  122.                     hPalette = NULL ;
  123.                }
  124.                
  125.                     // Load the packed DIB into memory
  126.  
  127.                SetCursor (LoadCursor (NULL, IDC_WAIT)) ;
  128.                ShowCursor (TRUE) ;
  129.  
  130.                pPackedDib = PackedDibLoad (szFileName) ;
  131.  
  132.                ShowCursor (FALSE) ;
  133.                SetCursor (LoadCursor (NULL, IDC_ARROW)) ;
  134.  
  135.                if (pPackedDib)
  136.                {
  137.                          // Create the palette from the DIB color table
  138.  
  139.                     hPalette = PackedDibCreatePalette (pPackedDib) ;
  140.                }
  141.                else
  142.                {
  143.                     MessageBox (hwnd, TEXT ("Cannot load DIB file"), 
  144.                                 szAppName, 0) ;
  145.                }
  146.                InvalidateRect (hwnd, NULL, TRUE) ;
  147.                return 0 ;
  148.           }
  149.           break ;
  150.  
  151.      case WM_PAINT:
  152.           hdc = BeginPaint (hwnd, &ps) ;
  153.  
  154.           if (hPalette)
  155.           {
  156.                SelectPalette (hdc, hPalette, FALSE) ;
  157.                RealizePalette (hdc) ;
  158.           }
  159.           
  160.           if (pPackedDib)
  161.                SetDIBitsToDevice (hdc, 
  162.                                   0,   
  163.                                   0,   
  164.                                   PackedDibGetWidth (pPackedDib), 
  165.                                   PackedDibGetHeight (pPackedDib),
  166.                                   0,                            
  167.                                   0,                            
  168.                                   0,                            
  169.                                   PackedDibGetHeight (pPackedDib),  
  170.                                   PackedDibGetBitsPtr (pPackedDib), 
  171.                                   pPackedDib, 
  172.                                   DIB_RGB_COLORS) ;
  173.           EndPaint (hwnd, &ps) ;
  174.           return 0 ;
  175.  
  176.      case WM_QUERYNEWPALETTE:
  177.           if (!hPalette)
  178.                return FALSE ;
  179.  
  180.           hdc = GetDC (hwnd) ;
  181.           SelectPalette (hdc, hPalette, FALSE) ;
  182.           RealizePalette (hdc) ;
  183.           InvalidateRect (hwnd, NULL, TRUE) ;
  184.  
  185.           ReleaseDC (hwnd, hdc) ;
  186.           return TRUE ;
  187.  
  188.      case WM_PALETTECHANGED:
  189.           if (!hPalette || (HWND) wParam == hwnd)
  190.                break ;
  191.  
  192.           hdc = GetDC (hwnd) ;
  193.           SelectPalette (hdc, hPalette, FALSE) ;
  194.           RealizePalette (hdc) ;
  195.           UpdateColors (hdc) ;
  196.  
  197.           ReleaseDC (hwnd, hdc) ;
  198.           break ;
  199.  
  200.           
  201.      case WM_DESTROY:
  202.           if (pPackedDib)
  203.                free (pPackedDib) ;
  204.  
  205.           if (hPalette)
  206.                DeleteObject (hPalette) ;
  207.  
  208.           PostQuitMessage (0) ;
  209.           return 0 ;
  210.      }
  211.      return DefWindowProc (hwnd, message, wParam, lParam) ;
  212. }
  213.  
  214.